function J = cost_function(X, U, e, data, P_load_future)
% =========================================================================
% cost_function.m - (新版) NMPC的自定义成本函数
% 【严格按照《混合动力无人机多目标能量管理策略研究》提纲4.1.1节公式编写】
% =========================================================================
% 输入:
%   X:      未来状态轨迹 [x(k+1|k); x(k+2|k); ...; x(k+N|k)]
%   U:      未来控制序列 [u(k|k);   u(k+1|k); ...; u(k+N-1|k)]
%   P_load_future: 预测的未来扰动序列 (这里我们简化为使用当前值)

    % 加载参数 (只加载一次)
    persistent CostParams FCParams SimParams
    if isempty(CostParams)
        CostParams = evalin('base', 'CostParams');
        FCParams   = evalin('base', 'FCParams');
        SimParams  = evalin('base', 'SimParams');
    end
    
    dt = SimParams.Ts;
    J = 0; % 初始化总成本
    
    % --- 遍历整个预测时域，累加每一步的成本 ---
    for k = 1:data.PredictionHorizon
        % 提取当前预测步(k)和下一步(k+1)的状态
        % X(k,:) 是预测的k时刻的状态, X(k+1,:)是k+1时刻的状态
        state_k   = X(k, :);
        state_kp1 = X(k+1, :);
        
        SOC_k         = state_k(1);
        P_fc_k        = state_k(2);
        alpha_decay_k = state_k(3);
        
        SOC_kp1       = state_kp1(1);
        alpha_decay_kp1 = state_kp1(3);
        
        % =================================================================
        % 1. 氢气消耗成本 C_H2
         % 提纲公式: C_H2 = m_H2 * p_H2 (通过氢气质量乘以单价) [cite: 103]
        %           其中, m_H2 = k_H2 * P_fc * dt
        % 公式含义: 计算在一个时间步内，由燃料电池输出功率P_fc所消耗的氢气质量，
        %           并将其转换为金钱成本。
        % =================================================================
        % 我们关心的是k到k+1这个区间的成本，所以用k+1时刻的功率P_fc_kp1来计算
        P_fc_kp1 = state_kp1(2);
        mass_h2_consumed = CostParams.k_H2 * P_fc_kp1 * dt;
        cost_h2 = CostParams.p_H2 * mass_h2_consumed;

        % =================================================================
        % 2. 锂电池寿命损耗成本 C_bat_loss
         % 提纲公式: C_bat_loss = (C_bat_total / N_cycle) * |ΔSOC| [cite: 104]
        % 公式含义: 将电池的一次完全充放电成本，分摊到每一个微小的SOC变化量上。
        %           SOC变化越大，该步的损耗成本越高。
        % =================================================================
        delta_soc = abs(SOC_kp1 - SOC_k);
        cost_per_soc_change = CostParams.C_bat_total / CostParams.N_cycle;
        cost_bat = cost_per_soc_change * delta_soc;

        % =================================================================
        % 3. 燃料电池老化成本 C_fc_age
         % 提纲公式: C_fc_age = (C_fc_total / α_max) * Δα_decay [cite: 106, 107]
        % 公式含义: 将燃料电池的总重置成本，分摊到每一个百分比的衰减量上。
        %           衰减增量越大，该步的老化成本越高。
        % =================================================================
        delta_alpha_decay = alpha_decay_kp1 - alpha_decay_k;
        cost_per_alpha_change = CostParams.C_fc_total / CostParams.alpha_max;
        cost_fc = cost_per_alpha_change * delta_alpha_decay;
        
        % --- 累加总成本 ---
        J = J + cost_h2 + cost_bat + cost_fc;
    end
end